package com.happyghost.juc.semaphore;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Semaphore;

public class SemaphoreDemo {

    /**
     * 以下代码模拟了对某个服务的并发请求，每次只能有 3 个客户端同时访问，请求总数为 10。
     * <p>
     * void acquire()  : 从此信号量获取一个许可，在提供一个许可前一直将线程阻塞，否则线程被中断。
     * void release()  : 释放一个许可，将其返回给信号量。
     * int availablePermits()  : 返回此信号量中当前可用的许可数。
     * boolean hasQueuedThreads()  : 查询是否有线程正在等待获取。
     *
     * @param args
     */
    public static void main(String[] args) {
        final int clientCount = 3;
        final int totalRequestCount = 10;

        Semaphore semaphore = new Semaphore(clientCount);
        ExecutorService executorService = Executors.newCachedThreadPool();
        for (int i = 0; i < totalRequestCount; i++) {
            executorService.execute(() -> {
                try {
                    semaphore.acquire();
                    System.out.print(semaphore.availablePermits() + " ");
                } catch (InterruptedException e) {
                    e.printStackTrace();
                } finally {
                    semaphore.release();
                }
            });
        }
        executorService.shutdown();

    }
}
